// 定义一个数值和字符串的联合类型
let a:number|string=100
let b:number |string='100'
console.log(a,b);

// 定义一个类型断言
let someValue:string='2222'
let c:number=(someValue as string).length
console.log(c);

// 定义一个 void 实现函数的无返回值
function foo(one:number,two:number):void{
    console.log(one+two);
}

// 定义一个 never 的函数
function never(x:number,y:number){
  return x+y
}

// 分别定义 es5 和 ts 的函数定义
function foo1(){}  //es5

let foo2=()=>{}  //ts


// 定义函数时， 分别实现参数类型、剩余参数、默认参数
// 参数类型
function foo3(xs:number,ys:number):number{
    return xs+ys
}

// 剩余参数
function foo4(a:number,...args:number[]){
    console.log(a);
    console.log(args);
    
}
foo4(1,2,3,4,5)

// 默认参数
function foo5(name:string,age:number=15){
    console.log(name,age);
}
foo5('1234')

// 实现一个函数重载
function foo6(name1:number,age1:number):number
function foo6(name1:string,age1:string):string
function foo6(name1:any,age1:any):any{
    return name1+age1
}
foo6(20,76)



// 使用 es5 的方式定义一个类和es6中定义类
// es6中定义类\
class Person1{
    name:string;
    age:number;
    constructor(name:string,age:number){
        this.name=name
        this.age=age
    }
}
// 在 ts 中定义一个类并实现继承（
class Stu extends Person1{
    constructor(name:string,age:number){
        super(name,age)
    }
}

let p1=new Person1('111',222)
console.log(p1);


let p2=new Stu('111',6666)
console.log(p2);

// 2种方式定义一个数组（数组中的元素可以是任意类型）
let d:[number,boolean,string]=[1,true,'hah']
console.log(d);

let f:Array<number>=[1,2,6,8]
console.log(f);

// Ts定义一个求和函数;例Add(2,8,9,6,5,8,7),返回结果45
function fun1(Add:number[]){
    let as=Add.reduce((a,b)=>{
        return a+b
    },0)
    return as
}
console.log(fun1([2,8,9,6,5,8,7]));

// Ts定义一个函数返回值为boolean类型的判断函数;例isTrue(nudefined),返回false
function isTrue(a:any){
    if(Boolean(a)==false){
        return false
    }else{
        return true
    }
}
console.log(isTrue(undefined));


// 计数：
function fun2(a:string,b:string){
    let num:number=0;
    (a.split('')).forEach((item,index) => {
        if(item===b){
            num++
        } 
    });
    return num
}
console.log(fun2("acdkjcdeicl",'c'));

// 数字（乘5）添加：
// var arrs= ['a','c',6,'e',5,3,'d']
function fun(arrs:any){
    var sun=[];
    for (let i = 0; i < arrs.length; i++) {
        if(isNaN(arrs[i])==false){
            sun.push(arrs[i]*5)
        }
    }
    return sun
}
console.log(fun(['a','c',6,'e',5,3,'d']));


// 写一个函数bouncer（），实现将数组中的真值，添加到一个新数组中。   

function bouncer(arr:[number,string,string,boolean,number]){
    var newArr=[]
    for (let i = 0; i < arr.length; i++) {
        if(Boolean(arr[i])==true){
            newArr.push(arr[i])
        }
    }
    return newArr
}   
console.log(bouncer([7,'ate','',false,9]));

// 补零：
// var arrss=[2,5,6,10];

function fun3(arr1:string[]){
    let newArr:string[]=[]
    arr1.forEach((item)=>{
        if(item<"10"){
            newArr.push(("0"+item))
        }else{
            newArr.push(item)
        }
    })
    return newArr
}
console.log(fun3(["2","3","20","4"]));
